home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 43 / Amiga Format CD43 (1999)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-09].iso / -serious- / programming / e / nsm / examples / cmdfill.e < prev    next >
Text File  |  1999-06-14  |  2KB  |  88 lines

  1. -> cmdfill.e
  2. /*
  3. cmdfill.c by Kjetil S. Matheussen 10.12.98.
  4. cmdfill.e by Claude Heiland-Allen 1999.05.16
  5.  
  6. cmdfill command start end delta [post] [nofill]
  7.  
  8. command, start, end are hex
  9. delta is float
  10.  
  11. fillcmdnum now default, with nofill control
  12.  
  13. */
  14.  
  15. OPT OSVERSION=37
  16.  
  17. MODULE 'other/nsm', 'other/nsm_extra'
  18.  
  19. RAISE "MEM" IF String() = NIL
  20.  
  21. PROC main() HANDLE
  22.  
  23.     DEF oss, block,
  24.         track, line, page, intnotelast, intnote, post = TRUE,
  25.         prefix, rangestart, rangeend, firsttime = TRUE, onecmd = TRUE,
  26.         incdec = -1.0, note = 0.0, rdargs = NIL, args : PTR TO LONG
  27.  
  28.     IF (oss := nsm_getoctabase()) = NIL THEN Raise("nsm")
  29.     IF (block := nsm_getcurrblockbase(oss)) = NIL THEN Raise("nsm")
  30.  
  31.     -> ReadArgs() is much easier and nicer
  32.     -> changed FILLCMDNUM to (more useful?) NOFILL
  33.     args := NEW [0,0,0,0,0,0]
  34.     IF (rdargs := ReadArgs(
  35.         'P=COMMAND/A,RS=START/A,RE=END/A,ID=DELTA/A,POST/S,NF=NOFILL/S',
  36.         args, NIL)) = NIL THEN Raise("ARGS")
  37.  
  38.     prefix     := hexval(args[0])
  39.     rangestart := hexval(args[1])
  40.     rangeend   := hexval(args[2])
  41.     incdec     := RealVal(args[3])
  42.     post       := args[4]
  43.     onecmd     := args[5]
  44.  
  45.     IF (prefix < 0) OR (127 < prefix) THEN Raise("ARGS")
  46.     IF ! incdec <= 0.0 THEN Raise("ARGS")
  47.  
  48.     track := nsm_getcurrtrack(oss)
  49.     line  := nsm_getcurrline(oss)
  50.     page  := nsm_getcurrpage(oss)
  51.  
  52.     IF rangeend < rangestart THEN incdec := ! -incdec
  53.  
  54.     note := rangestart ! + (post ! * incdec)    -> TRUE = -1 in E  (= 1 in C)
  55.  
  56.     REPEAT
  57.         note := ! note + incdec
  58.         intnote := ! note !
  59.         IF (intnote <> intnotelast) OR firsttime
  60.             IF Not(onecmd) OR firsttime
  61.                 nsm_setcmdnum(block, track, line, page, prefix)
  62.             ENDIF
  63.             nsm_setcmdlvl(block, track, line, page, intnote)
  64.             firsttime := FALSE
  65.             intnotelast := intnote
  66.         ENDIF
  67.         line++
  68.     UNTIL ((! incdec < 0.0) AND (! note < (rangeend!))) OR
  69.           ((! incdec > 0.0) AND (! note >=(rangeend!)))
  70.  
  71.     nsm_updateeditor(oss)
  72.  
  73. EXCEPT DO
  74.  
  75.     IF rdargs THEN FreeArgs(rdargs)
  76.  
  77.     SELECT exception
  78.     CASE "ARGS"; WriteF('Error: bad args\n')
  79.     CASE "MEM";  WriteF('Error: no mem\n')
  80.     CASE "nsm";  WriteF('Error: no nsm\n')
  81.     ENDSELECT
  82.  
  83. ENDPROC IF exception THEN 5 ELSE 0
  84.  
  85. PROC hexval(str) IS Val(StringF(String(16),'$\s',str))
  86.  
  87. version: CHAR '$VER: cmdfill 1.1 (1999.05.16)', 0
  88.